package groovyDomain

import java.util.ArrayList
import static org.junit.Assert.*;

import tadp.tp.domain.Fecha
import tadp.tp.domain.OrganizadorDeReuniones
import tadp.tp.domain.Reunion
import tadp.tp.domain.condiciones.QueryBuilder

import Observers.ObserverBuilder
import accionesPosteriores.AccionPosterior

public class Spec {

	static {
		Object.metaClass {
			crea = {
				reunion -> delegate
			}
			con = {
				personas -> delegate
			}
			que = {
				cumplan -> new ArrayList<Object>()
			}
		}
		
		Array.metaClass() {
			estas = {
				caracteristicaDeReunion -> delegate.add(caracteristicaDeReunion)
			}
			limitandola = {
				con -> delegate
			}
			un = {
				limite -> delegate.add(limite)
			}
			programada = {
				entre -> delegate
			}
			las = {
				unaHora -> delegate.add(unaHora)
			}
			y = {
				otraHora -> delegate.add(otraHora)
			}
			para = {
				el -> delegate
			}
			dia = {
				unDia -> delegate.add(unDia)
			}
			del = {
				unMes -> delegate.add(unMes)
			}
			ademas = {
				ejecutar -> delegate
			}
			considerando = {
				tambien -> delegate
			}
			estos = {
				observers -> delegate.add(observers)
				def organizadorDeReunion
				organizadorDeReunion.organizarReunion(
				delegate.get(0), delegate.get(1), delegate.get(2), delegate.get(3),
				new Fecha(delegate.get(4), delegate.get(5)), delegate.get(6), delegate.get(7))
			}
			noEstasDisponible = {
				assertFalse(get(0).estaDisponibleEntre(delegate.get(1),delegate.get(2), new Fecha(delegate.get(3),delegate.get(4)))
			}
			estasDisponible = {
				assertTrue(get(0).estaDisponibleEntre(delegate.get(1),delegate.get(2), new Fecha(delegate.get(3),delegate.get(4)))
			}
		}

		Reservable.metaClass {
			cumplis = {
				con -> delegate
			}
			estas = {
				condiciones -> assertTrue(delegate.cumpleCondiciones(condiciones))
			}
			entre = {
				unHorario = {
					def parametros = new ArrayList<Object>()
					parametros.add(delegate)
					parametros.add(unHorario)
					parametros
				}
			}
		}
		
		Reunion.metaClass {
			tu = {
				costo -> delegate
			}
			es = {
				precio -> assertEquals(precio, delegate.costoReunion(), 0.1);
			}
			
		}
		
	}
	
}
